from django.http import HttpResponse, HttpResponseForbidden, JsonResponse
from django.shortcuts import render, redirect
from django.views import View
import re
from django.contrib.auth import login
from django_redis import get_redis_connection

from .models import User
from meiduo_mall.utils.response_code import RETCODE



# Create your views here.

class RegisterView(View):

    def get(self, request):
        # return HttpResponse("hello world!")
        return render(request, "register.html")


    def post(self, request):
        """
        处理用户注册业务
        :param request:
        :return:
        """
        # 接收前端发送的表单数据
        query_dict = request.POST
        username = query_dict.get("username", "")
        password = query_dict.get("password", "")
        password2 = query_dict.get("password2", "")
        mobile = query_dict.get("mobile", "")
        sms_code = query_dict.get("sms_code", "")   # 后期补充短信验证码
        # 选择相信协议：是一个多选项，状态：on 或者 None
        allow = query_dict.get("allow", "")

        # 验证表单数据
        # 无论前端是否做验证，后端代码都必须验证

        # 1. 验证必须输入有内容
        # all(可迭代对象）： 判断所有数据不能为空或者None
        #       空："", [], (), {}
        if all([username, password, password2, mobile, sms_code, allow]) is  False:
            return HttpResponseForbidden("缺少必填内容")

        # 2. 验证输入内容必须满足正确的格式
        if not re.match("^[a-zA-Z0-9_-]{5,20}$", username):
            return HttpResponseForbidden("请输入5-20个字符的用户名")
        if not re.match("^[0-9A-Za-z]{8,20}$", password):
            return HttpResponseForbidden("请输入8-20位的密码")
        if password != password2:
            return HttpResponseForbidden("两次输入的密码不一致")
        if not re.match("^1[345789]\d{9}$", mobile):
            return HttpResponseForbidden("请输入正确的手机号码")


        # 补充验证短信验证码
        #   1. 链接redis数据库
        redis_conn = get_redis_connection("verify_code")
        #   2. 读取短信验证码（通过key为mobile获取）
        sms_code_server = redis_conn.get("sms_%s" % mobile)

        #   3. 判断验证码是否过期
        if sms_code_server is None:
            return HttpResponseForbidden("短信验证码已过期")
        #   4. 删除redis中的短信验证码
        redis_conn.delete(mobile)
        #   5. 判断用户输入的短信验证码是否和服务器的短信验证码一致
        sms_code_server = sms_code_server.decode()
        if sms_code_server != sms_code:
            return HttpResponseForbidden("请重新输入正确的短信验证码")


        # （业务逻辑处理）存储数据库
        # create: 这个函数创建的数据记录中密码是明码，不安全，需要加密密码。django的用户创建里面有实现。
        # user = User.objects.create(username=username, password=password, mobile=mobile)
        # # 重新设置加密后的密码
        # user.set_password(password)
        # user.save()

        # 创建用户记录并对密码进行加密：
        user = User.objects.create_user(username=username, password=password, mobile=mobile)

        # 状态保持
        login(request, user)


        # 返回响应
        # 注册业务成功，重定向到首页
        # "/" : 127.0.0.1:8000/
        # "info/": 127.0.0.1:8000/当前路径/info/
        #          127.0.0.1:8000/register/info/
        # "/info/":127.0.0.1:8000/info/

        return redirect("/")

        # 最后调试查看业务执行的流程.... 使用单步查看



class UserContentView(View):

    def get(self, request, username):
        """判断用户名是否重复"""

        # 根据username提取url路径的用户名
        # 查询数据库查看当前用户名是否已经存在
        count = User.objects.filter(username=username).count()

        # 返回json数据给前端（用于判断当前用户是否存在）
        content = {"count": count, "code": RETCODE.OK, "errmsg": "OK"}

        # 返回响应
        # return JsonResponse(content, status=400)
        return JsonResponse(content)



